home *** CD-ROM | disk | FTP | other *** search
/ Complete Linux / Complete Linux.iso / xwindows / demos / xfract_1.z / xfract_1 / xfractint-1.06 / unixscr.c < prev    next >
C/C++ Source or Header  |  1992-10-05  |  44KB  |  2,120 lines

  1. /* Unixscr.c
  2.  * This file contains routines for the Unix port of fractint.
  3.  * It uses the current window for text and creates an X window for graphics.
  4.  *
  5.  * This file Copyright 1991 Ken Shirriff.  It may be used according to the
  6.  * fractint license conditions, blah blah blah.
  7.  *
  8.  * Some of the X stuff is based on xloadimage by Jim Frost.
  9.  * The FindWindowRoot routine is from ssetroot by Tom LaStrange.
  10.  * Other root window stuff is based on xmartin, by Ed Kubaitis.
  11.  * Some of the colormap stuff is from Mike Yang (mikey@sgi.com).
  12.  * Some of the zoombox code is from Bill Broadley.
  13.  * David Sanderson straightened out a bunch of include file problems.
  14.  */
  15.  
  16. #include <stdio.h>
  17. #include <stdlib.h>
  18. #include <curses.h>
  19. #include <X11/Xlib.h>
  20. #include <X11/keysym.h>
  21. #include <X11/Xatom.h>
  22. #include <signal.h>
  23. #include <sys/types.h>
  24. #ifdef _AIX
  25. #include <sys/select.h>
  26. #endif
  27. #include <sys/time.h>
  28. #include <sys/ioctl.h>
  29. #ifdef FPUERR
  30. #include <floatingpoint.h>
  31. #endif
  32. #ifdef __hpux
  33. #include <sys/file.h>
  34. #endif
  35. #include <fcntl.h>
  36. #include "fractint.h"
  37. #include "prototyp.h"
  38. #include "helpdefs.h"
  39.  
  40. /* Check if there is a character waiting for us.  */
  41. #define input_pending() (ioctl(0,FIONREAD,&iocount),(int)iocount)
  42.  
  43. /* external variables (set in the FRACTINT.CFG file, but findable here */
  44.  
  45. extern    int    dotmode;        /* video access method (= 19)       */
  46. extern    int    sxdots, sydots;     /* total # of dots on the screen   */
  47. extern    int    sxoffs, syoffs;     /* offset of drawing area          */
  48. extern    int    colors;         /* maximum colors available       */
  49. extern    int    initmode;
  50. extern    int    adapter;
  51. extern    int    gotrealdac;
  52. extern    int    inside_help;
  53. extern  float    finalaspectratio;
  54.  
  55. extern struct videoinfo videotable[];
  56.  
  57. /* the video-palette array (named after the VGA adapter's video-DAC) */
  58.  
  59. extern unsigned char dacbox[256][3];
  60.  
  61. extern void drawbox();
  62.  
  63. extern int text_type;
  64. extern int helpmode;
  65.  
  66. extern void fpe_handler();
  67.  
  68. extern WINDOW *curwin;
  69.  
  70. static int onroot = 0;
  71. static int fullscreen = 0;
  72. static int sharecolor = 0;
  73. static int privatecolor = 0;
  74. static int fixcolors = 0;
  75. static int rsync = 0; /* Run X events synchronously (debugging) */ 
  76. int slowdisplay = 0; /* We have a slow display, so don't print too much */
  77. static int simple_input = 0; /* Use simple input (debugging) */
  78. static char *Xdisplay = "";
  79. static char *Xgeometry = NULL;
  80.  
  81. static int unixDisk = 0; /* Flag if we use the disk video mode */
  82.  
  83. static int old_fcntl;
  84.  
  85. static int doesBacking;
  86.  
  87. /*
  88.  * The pixtab stuff is so we can map from fractint pixel values 0-n to
  89.  * the actual color table entries which may be anything.
  90.  */
  91. static int usepixtab = 0;
  92. static unsigned long pixtab[256];
  93. static int ipixtab[256];
  94.  
  95. static int fastmode = 0; /* Don't draw pixels 1 at a time */
  96. static int alarmon = 0; /* 1 if the refresh alarm is on */
  97. static int doredraw = 0; /* 1 if we have a redraw waiting */
  98.  
  99. /* Static routines */
  100. static Window FindRootWindow(void);
  101. static Window pr_dwmroot(Display *dpy, Window pwin);
  102. static int errhand(Display *dp, XErrorEvent *xe);
  103. static int getachar(void);
  104. static int handleesc(void); 
  105. static int translatekey(int ch); 
  106. static int xcmapstuff(void); 
  107. static int xhandleevents(void); 
  108. static void RemoveRootPixmap(void);
  109. static void doneXwindow(void);
  110. static void initdacbox(void);
  111. static void setredrawscreen(void); 
  112. static void clearXwindow(void);
  113. #ifdef FPUERR
  114. static void continue_hdl(int sig, int code, struct sigcontext *scp,
  115.     char *addr);
  116. #endif
  117.  
  118. /*
  119.  *----------------------------------------------------------------------
  120.  *
  121.  * unixarg --
  122.  *
  123.  *    See if we want to do something with the argument.
  124.  *
  125.  * Results:
  126.  *    Returns 1 if we parsed the argument.
  127.  *
  128.  * Side effects:
  129.  *    Increments i if we use more than 1 argument.
  130.  *
  131.  *----------------------------------------------------------------------
  132.  */
  133. int
  134. unixarg(argc,argv,i)
  135. int argc;
  136. char **argv;
  137. int *i;
  138. {
  139.     if (strcmp(argv[*i],"-display")==0 && (*i)+1<argc) {
  140.     Xdisplay = argv[(*i)+1];
  141.     (*i)++;
  142.     return 1;
  143.     } else if (strcmp(argv[*i],"-fullscreen")==0) {
  144.     fullscreen = 1;
  145.     return 1;
  146.     } else if (strcmp(argv[*i],"-disk")==0) {
  147.     unixDisk = 1;
  148.     return 1;
  149.     } else if (strcmp(argv[*i],"-onroot")==0) {
  150.     onroot = 1;
  151.     return 1;
  152.     } else if (strcmp(argv[*i],"-share")==0) {
  153.     sharecolor = 1;
  154.     return 1;
  155.     } else if (strcmp(argv[*i],"-fast")==0) {
  156.     fastmode = 1;
  157.     return 1;
  158.     } else if (strcmp(argv[*i],"-simple")==0) {
  159.     simple_input = 1;
  160.     return 1;
  161.     } else if (strcmp(argv[*i],"-slowdisplay")==0) {
  162.     slowdisplay = 1;
  163.     return 1;
  164.     } else if (strcmp(argv[*i],"-sync")==0) {
  165.     rsync = 1;
  166.     return 1;
  167.     } else if (strcmp(argv[*i],"-private")==0) {
  168.     privatecolor = 1;
  169.     return 1;
  170.     } else if (strcmp(argv[*i],"-fixcolors")==0 && *i+1<argc) {
  171.     fixcolors = atoi(argv[(*i)+1]);
  172.     (*i)++;
  173.     return 1;
  174.     } else if (strcmp(argv[*i],"-geometry")==0 && *i+1<argc) {
  175.     Xgeometry = argv[(*i)+1];
  176.     (*i)++;
  177.     return 1;
  178.     } else {
  179.     return 0;
  180.     }
  181. }
  182. /*
  183.  *----------------------------------------------------------------------
  184.  *
  185.  * UnixInit --
  186.  *
  187.  *    Initialize the windows and stuff.
  188.  *
  189.  * Results:
  190.  *    None.
  191.  *
  192.  * Side effects:
  193.  *    Initializes windows.
  194.  *
  195.  *----------------------------------------------------------------------
  196.  */
  197. void
  198. UnixInit()
  199. {
  200.     /*
  201.      * Check a bunch of important conditions
  202.      */
  203.     if (sizeof(short) != 2) {
  204.     fprintf(stderr,"Error: need short to be 2 bytes\n");
  205.     exit(-1);
  206.     }
  207.     if (sizeof(long) != sizeof(FLOAT4)) {
  208.     fprintf(stderr,"Error: need sizeof(long)=sizeof(FLOAT4)\n");
  209.     exit(-1);
  210.     }
  211.  
  212.     initscr();
  213.     curwin = stdscr;
  214.     cbreak();
  215.     noecho();
  216.  
  217.     if (standout()) {
  218.     text_type = 1;
  219.     standend();
  220.     } else {
  221.     text_type = 1;
  222.     }
  223.  
  224.     signal(SIGINT,goodbye);
  225.     signal(SIGFPE, fpe_handler);
  226.     /*
  227.     signal(SIGTSTP,goodbye);
  228.     */
  229. #ifdef FPUERR
  230.     signal(SIGABRT,SIG_IGN);
  231.     /*
  232.         setup the IEEE-handler to forget all common ( invalid,
  233.         divide by zero, overflow ) signals. Here we test, if 
  234.         such ieee trapping is supported.
  235.     */
  236.     if (ieee_handler("set","common",continue_hdl) != 0 )
  237.         printf("ieee trapping not supported here \n");
  238. #endif
  239. }
  240.  
  241. /*
  242.  *----------------------------------------------------------------------
  243.  *
  244.  * UnixDone --
  245.  *
  246.  *    Cleanup windows and stuff.
  247.  *
  248.  * Results:
  249.  *    None.
  250.  *
  251.  * Side effects:
  252.  *    Cleans up.
  253.  *
  254.  *----------------------------------------------------------------------
  255.  */
  256.  
  257. void
  258. UnixDone()
  259. {
  260.     if (!unixDisk) {
  261.     doneXwindow();
  262.     }
  263.     if (!simple_input) {
  264.     fcntl(0,F_SETFL,old_fcntl);
  265.     }
  266.     mvcur(0,COLS-1, LINES-1,0);
  267.     nocbreak();
  268.     echo();
  269.     endwin();
  270. }
  271.  
  272. /*
  273.  *----------------------------------------------------------------------
  274.  *
  275.  * errhand --
  276.  *
  277.  *    Called on an X server error.
  278.  *
  279.  * Results:
  280.  *    None.
  281.  *
  282.  * Side effects:
  283.  *    Prints the error message.
  284.  *
  285.  *----------------------------------------------------------------------
  286.  */
  287. static int errhand(dp,xe)
  288. Display *dp;
  289. XErrorEvent *xe;
  290. {
  291.         char buf[200];
  292.         fflush(stdout);
  293.         printf("X Error: %d %d %d %d\n",xe->type,xe->error_code,
  294.         xe->request_code, xe->minor_code);
  295.         XGetErrorText(dp,xe->error_code,buf,200);
  296.         printf("%s\n",buf);
  297. }
  298.  
  299. #ifdef FPUERR
  300. /*
  301.  *----------------------------------------------------------------------
  302.  *
  303.  * continue_hdl --
  304.  *
  305.  *    Handle an IEEE fpu error.
  306.  *    This routine courtesy of Ulrich Hermes
  307.  *    <hermes@olymp.informatik.uni-dortmund.de>
  308.  *
  309.  * Results:
  310.  *    None.
  311.  *
  312.  * Side effects:
  313.  *    Clears flag.
  314.  *
  315.  *----------------------------------------------------------------------
  316.  */
  317. static void
  318. continue_hdl(sig,code,scp,addr)
  319. int sig, code;
  320.  
  321. struct sigcontext *scp;
  322. char *addr;
  323.  
  324. {
  325.     int i;
  326.     char out[20];
  327.     /*        if you want to get all messages enable this statement.    */
  328.     /*  printf("ieee exception code %x occurred at pc %X\n",code,scp->sc_pc); */
  329.     /*    clear all excaption flags                      */
  330.     i = ieee_flags("clear","exception","all",out);
  331. }
  332. #endif
  333.  
  334. #define DEFX 640
  335. #define DEFY 480
  336. #define DEFXY "640x480+0+0"
  337.  
  338. static Display *Xdp = NULL;
  339. static Window Xw;
  340. static GC Xgc = NULL;
  341. static Visual *Xvi;
  342. static Screen *Xsc;
  343. static Colormap    Xcmap;
  344. static int Xdepth;
  345. static XImage *Ximage =NULL;
  346. static char *Xdata;
  347. static int Xdscreen;
  348. static Pixmap    Xpixmap = 0;
  349. static int Xwinwidth=DEFX,Xwinheight=DEFY;
  350. static Win